package com.lngsyz.ywtb.job;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.lngsyz.ywtb.biz.service.BizService;
import com.lngsyz.ywtb.biz.service.YwtbCityOrderService;
import com.lngsyz.ywtb.entity.source1.YwtbCityOrder;
import com.lngsyz.ywtb.enumeration.Pay;
import com.lngsyz.ywtb.pay.entity.SealTradeTrackVO;
import com.lngsyz.ywtb.pay.service.PayService;
import com.lngsyz.ywtb.util.CommonUtil;

//表达式	说明
//0 0 2 1 * ? *				              表示在每月的1日的凌晨2点调整任务
//0 15 10 ? * MON-FRI			表示周一到周五每天上午10:15执行作业
//0 15 10 ? 6L 2002-2006		表示2002-2006年的每个月的最后一个星期五上午10:15执行作
//0 0 10,14,16 * * ?			每天上午10点，下午2点，4点
//0 0/30 9-17 * * ?			              朝九晚五工作时间内每半小时
//0 0 12 ? * WED				表示每个星期三中午12点
//0 0 12 * * ?				              每天中午12点触发
//0 15 10 ? * *				              每天上午10:15触发
//0 15 10 * * ?				              每天上午10:15触发
//0 15 10 * * ? *				每天上午10:15触发
//0 15 10 * * ? 2005			2005年的每天上午10:15触发
//0 * 14 * * ?				              在每天下午2点到下午2:59期间的每1分钟触发
//0 0/5 14 * * ?				在每天下午2点到下午2:55期间的每5分钟触发
//0 0/5 14,18 * * ?			              在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
//0 0-5 14 * * ?				在每天下午2点到下午2:05期间的每1分钟触发
//0 10,44 14 ? 3 WED			每年三月的星期三的下午2:10和2:44触发
//0 15 10 ? * MON-FRI			周一至周五的上午10:15触发
//0 15 10 15 * ?				每月15日上午10:15触发
//0 15 10 L * ?				              每月最后一日的上午10:15触发
//0 15 10 ? * 6L				每月的最后一个星期五上午10:15触发
//0 15 10 ? * 6L 2002-2005	    2002年至2005年的每月的最后一个星期五上午10:15触发
//0 15 10 ? * 6#3				每月的第三个星期五上午10:15触发


@Component
public class RefreshPayStatusJob {
	
	@Autowired
	BizService bizService;	
	@Autowired
	YwtbCityOrderService ywtbCityOrderService;	
	@Autowired
	PayService payService;	

	/**
	 * 每10s刷新一次订单状态
	 * 如果支付了，更新状态，进一步处理，
	 * 没支付的，到10分钟，关闭订单
	 */
	@Scheduled(fixedDelay = 10000)  //间隔10秒
    public void job1(){
        try {
        	System.out.println("#####任务启动：" + getDate());
        	List<YwtbCityOrder> ywtbCityOrders = ywtbCityOrderService.findForPayStatusJob();
        	System.out.println("#####查询数据：" + ywtbCityOrders.size() + "条");
        	Date dbDate = ywtbCityOrderService.selectDBDate();
        	for(YwtbCityOrder ywtbCityOrder : ywtbCityOrders) {
        		try {
        			System.out.println("#####订单ID：" + ywtbCityOrder.getId());
        			bizService.updateOrder(ywtbCityOrder);
        			if(StringUtils.equals(ywtbCityOrder.getPay(), Pay.PAY_YES.getKey())) {
        				// ywtbCityOrderService.payDeal(ywtbCityOrder);
        			} else if(StringUtils.equals(ywtbCityOrder.getPay(), Pay.PAY_NO.getKey())) {
        				// 如果超过5分钟未支付，关闭订单
        				if(!CommonUtil.calculateDuration(ywtbCityOrder.getGmtCreate(), dbDate, 5 * 60)) {
        					String tradeNo = ywtbCityOrder.getTradeno();
        					SealTradeTrackVO closePayBean = new SealTradeTrackVO();
        					closePayBean.setTradeNo(tradeNo);
        					boolean successFlag = payService.closeTradeOrder(closePayBean);
        					if(successFlag) {
        						ywtbCityOrder.setPay(Pay.PAY_CLOSED.getKey());
        						ywtbCityOrderService.updateOrder(ywtbCityOrder);
        					}
        				}
        			}
        		} catch(Exception e) {
        			e.printStackTrace();
        		}
        	}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
	
	private String getDate(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date());
    }
}
